package com.bvgol.examples.springboot.redis.logic;/**
 * @Classname LogicService
 * @Description TODO
 * @Date 2021/1/4 14:05
 * @Created by GUOCHEN
 */

import com.bvgol.examples.springboot.redis.entity.Book;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.Caching;

/**
 * @program: my-spring-completely
 * @description: 模拟业务类
 * @author: GUOCHEN
 * @create: 2021/01/04 14:05
 */
public interface LogicService {
    /**
     * 功能描述: lua 脚本版
     * 此种实现完整描述(交互式)
     * 在生成这个数据对象的时候
     * 生成一个唯一标志，防止重复提交（响应到页面有一份，有一份保存到redis中）
     * 使用(提交/更新)时
     * 查询redis中有没有token信息, 有，则是第一次提交，放行并删除redis中的orderToken
     * 没有,不合规的数据`返回
     * ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
     * ★★★★特别注意`这种方式 实现简单`但是需要结合业务上下文★★★★
     * ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
     *
     * @date: 2021/1/4 15:09
     */
    Book logic(Integer token) throws Exception;

    /**
     * 功能描述: 同步接口拆异步
     *
     * @param
     * @return: java.lang.String
     * @author: 郭辰
     * @date: 2021/3/5 15:38
     */
    String synchronizeToAsync(String uuid, String logicArgs);

    /**
     * 功能描述: 同步接口拆异步 接口返回
     *
     * @param
     * @return: java.lang.String
     * @author: 郭辰
     * @date: 2021/3/5 15:39
     */
    String synchronizeToAsyncResult(String uuid);

    /**
     * 功能描述: 模拟异步方法执行
     *
     * @param uuid
     * @param logicArgs
     * @return: void
     * @author: 郭辰
     * @date: 2021/3/5 15:40
     */
    void mockSynchronizeToAsyncResult(String uuid, String logicArgs);

    /**
     * 功能描述: 对数据进行md5取值
     *
     * @param book
     * @return: java.lang.String
     * @author: 郭辰
     * @date: 2021/3/19 9:53
     */
    String md5(Book book);

    String redisCacheAble();

    @Cacheable(value = {"category2"},key = "#root.methodName")
    String redisCacheAble2();

    @CacheEvict(value = {"category"},key = "'categorykey'")
    String redisCacheEvict();

    @CacheEvict(value = {"category"},allEntries = true)
    String redisCacheEvict2();

    @Caching(evict = {
            @CacheEvict(value = {"category"},key = "'categorykey'"),
            @CacheEvict(value = {"category2"},key = "#root.methodName")
    })
    String redisCaching();
}
